package com.zrrd.straw1.controller;

import com.baomidou.mybatisplus.extension.api.R;
import com.github.pagehelper.PageInfo;
import com.zrrd.straw1.entity.Question;
import com.zrrd.straw1.service.IQuestionService;
import com.zrrd.straw1.service.impl.ServiceException;
import com.zrrd.straw1.vo.QuestionVo;
import com.zrrd.straw1.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

@Slf4j    //Lombok提供了日志功能，写在类上，类中的方法可以直接使用 log 对象来记录日志到控制台。
@RestController
@RequestMapping("/questions")
public class QuestionController {

    @Autowired
    IQuestionService questionService;

    //前端发送get请求： /questions/27  和以前不一样，/questions?qid=27
    //直接把参数写到请求路径中！省掉了参数的名字，标志就是在路径分隔符 / 后面
    //{} 是路径参数的占位符，{id}中的id 是自定义的变量名。
    //     /{id}/{username}/{password}
    @GetMapping("/{id}")
    public Result<Question> question( @PathVariable Integer id ){
        if(id==null){
            return Result.invalidRequest("ID不同为空");
        }
        Question question = questionService.getQuestionById( id );
        return Result.ok( question );
    }

    //PreAuthorize 注解表示：必须拥有ROLE_TEACHER 权限/角色才能访问。
    @PreAuthorize("hasRole('ROLE_TEACHER')")
    @GetMapping("/teacher")
    public Result<PageInfo<Question>> teachers(
            @AuthenticationPrincipal UserDetails userDetails,
            Integer pageNum ){

        if (pageNum == null) pageNum = 1 ;
        Integer pageSize = 5 ;

        PageInfo<Question> pageInfo =
        questionService.getQuestionsByTeacherName(userDetails.getUsername(), pageNum,pageSize);

        //是把 pageInfo 放到 data 变量中，前端获取的 data 是 PageInfo
        //再从 data 中获取 .list 来得到 question 列表。
        return Result.ok( pageInfo );
    }




    //1.只接收 POST 请求
    //2.不写（），表示使用类上的路径 /questions
    @PostMapping
    public Result createQuestion(@Validated QuestionVo questionVo,
                                 BindingResult bindingResult,
                                 @AuthenticationPrincipal UserDetails userDetails){

        //如果测试，需要把前端的js验证关掉。后端验证是第二道防线。
        if(bindingResult.hasErrors()){
            String message = bindingResult.getFieldError().getDefaultMessage();
            return Result.unprocesableEntity( message );
        }

        //把提交的问题给业务层完成添加question表即可，但是关联标签，关联老师要在数据表中保存
        //到数据库看表结构。
        try {
            questionService.saveQuestion(questionVo, userDetails.getUsername());
            return Result.ok("提交成功");
        }catch (ServiceException e ){
            System.out.println("保存失败" + e );
            return Result.failed(e);
        }

        //测试可以接收前端的提交问题内容
        //System.out.println( questionVo );
        //return Result.ok("发布成功");
    }





    //因为请求意思是获取数据库上的数据，所以使用 GET 请求方式。
    //获取用户信息！通过 Secruity 框架来获取。security 始终在做认证操作。
    //第一次登录后，用户信息保存在 UserDetails 用户详情类中。
    //@AuthenticationPrincipal 是从Security框架中获取当前登录的 UserDetails 对象。
    @GetMapping("/my")
    public Result<List<Question>> my( @AuthenticationPrincipal UserDetails userDetails ,
                                      Integer pageNum ){
        //System.out.println("当前登录的用户信息：" + userDetails.getUsername());

        //先自定义每页显示的条数。
        int pageSize = 3 ;

        //如果没指定页码，默认返回第1页，如果指定页码，返回指定页码
        if( pageNum == null ){
            pageNum = 1 ;
        }
        System.out.println("本次请求页码 pageNum : " + pageNum );
        //业务层要求调用条件必须满足。但是 Controller 不能定义死，所以向前端页面提供要求 。
        PageInfo<Question> list = questionService.getQuestions(userDetails.getUsername(),pageNum, pageSize );

        return Result.ok(list);
    }


}
